#!/usr/bin/env python3
#
#coding: utf-8

#youtube解说词2vplayer字幕txt格式转换器.py
#版本：V0.0.1
#作者：陈义
#2022-02-20
"""
此文件V0.0.1版本只适用于复制出来的解说词像如下格式的文本，即时间和解说词都单独占一行且时间是"分:秒"的格式
00:00
jonathan rue has created many popular
00:02
and best-selling software courses in
00:04
this free course he will teach you how
00:06
to use the kivy library to create games

"""


import os
#from datetime import datetime
#import time

filepath = os.path.join(input("请输入文件所在的目录："))  #os.path.join()方法就是将目录和文件合成一个路径的方法
## path = "F:\\Videos\\PCB_EMI\\"
## filename = "Routing High Speed Boards in the 5G Era"
## file = path + filename + ".txt"   # 从油管复制保存的解说词

# 遍历目录下的txt文件
def file_Ergodic(file):
    pathfilenamelist = []
    for (dirpath, dirnames, filenames) in os.walk(file):
        for filename in filenames:
            if os.path.splitext(filename)[1] == '.txt':
                pathfilenamelist.append(file + "\\" + filename)
    return pathfilenamelist


    #return

files = file_Ergodic(filepath)
"""
for  f in files:
    print("pathfilenamelist is: " + f)
    print("f type is: " + str(type(f)))
"""
# 用.rt扩展名是因为VLC播放器可以打开，在默认浏览时可以看到文件，与视频用相同文件名方便自动加载字幕
# 不用txt格式是避免和源文件重名，内容其实是Vplayer格式的。
# save_as_file = files[0:-4] + ".rt"
"""
#F:\Videos\kivy\KivyMD
# 决定不区分，同时输出所有支持格式的字幕文件
# b站的字幕格式相对比较复杂，暂不处理
save_as_bool = input("制作B站字幕请输入b,制作VLC播放器可用的VPlayer格式的字幕文件输入v:")
if save_as_bool == "b" or "B":
    save_as_file = "F:\Videos\PCB_EMI\Drone Programming With Python调整好为B站使用的视频字幕.txt"
elif save_as_bool == "v" or "V":
    save_as_file = "F:\Videos\PCB_EMI\Drone Programming With Python Course调整好为Vplayer格式的视频字幕.txt"
"""

save_as_word = []
#time = ''

def saveToVplayerMain():
    time = ''
    for file in files:
        with open(file, 'r', encoding='utf-8') as f:   # 如果不加, encoding='utf-8'，在win10系统里运行文件里有中文会报错

            #print(f)
            for line in f.readlines():  # line通过遍历，则每次line里只有一个元素
                l = line.strip()
                #跳过空行
                if l == "":
                    continue
                    #break
                #print("line is: " + l)
                #print(l.strip()[-3])
                #if ":" in line:  # 时间是单独的一行，时间里含有":",所以用冒号来分离时间行,当文本行里也:时程序就会出错
                #if l.strip()[-3] == ':':
                    #print("True")
                # 当文本行里倒数第3个是“:”时程序也会出错，但概率会小很多。
                # if ":" in l[-3]:  # 如果没有第-3项则出错！所以只能判断是时间的行，不能用于文本行
                # 如果拆分时间来判断，当文本里有时间的字符被单独放一行时，虽然程序不报错但这样出来的结果也是不正确的
                #if ":" in l[-3]:  # 如果没有第-3项则出错！
                try:
                    # 判断字符串中是否含":"和用":"分割后的最后一个元素是否是数字，这样还是有不能解决文本中刚好有个时间又刚好在单独一行的情形，不过概率要小很多了
                    if ":" in l and l.strip(":")[-1].isdigit():
                        #print("':' in l and l.strip(':').isdigit() is True")
                        #print("l is: " + l)
                        time = mstime2hmstime(l)

                    else:
                        save_as_word.append(time + ":" + l + "\n")
                        """
                        # 用于多格式文件输出，此功能待开发
                        # 继续判断是保存为什么格式的字幕文件,
                        if save_as_bool == "b" or "B":
                            save_as_word.append(time + ":" + l + "\n")
                        elif save_as_bool == "v" or "V":
                            save_as_word.append(time + ":" + l + "\n")
                        """

                except  (TypeError, ValueError):
                    pass
        save_as_file = file[0:-4] + ".rt"
        with open(save_as_file, 'w', encoding='utf-8') as save_as_f:

            for var in save_as_word:
                save_as_f.write(var)


# 实现把分秒转成时分秒的形式
def mstime2hmstime(time):
     
     t = time.strip().split(":")  # 获得一个分和秒分开的列表
     #print(t)
     hours = int(t[0]) // 60  # t[0] // 60  
     
     minute = int(t[0]) % 60  # t[1] % 60
     
     hmstime = "%02d"%hours + ":" + "%02d"%minute+ ":" + t[1]

     
     return (hmstime)


if __name__ == "__main__":
    
    saveToVplayerMain()

